require 'pathname'

namespace(:generar) do
  desc "Genera el reporte de la evaluacion en formato csv"
  task :totalizado => :environment do
    def row(*args)
      args.join('|')
    end

    def tipo_evaluador(tipo, evaluado_id, evaluador_id)
      case tipo
      when "subordinado"
        "superior"
      when "superior"
        "subordinado"
      else
        if evaluado_id == evaluador_id
          "autoevaluacion"
        else
          "par"
        end
      end
    end

    #TODO: check_if========> Evaluacion.all ok?
    Evaluacion.all.each do  |evaluacion|
      started_at = Time.now.utc
      #evaluacion = Evaluacion.find(2)
      min        = Usuario.minimum(:id)
      max        = Usuario.maximum(:id)
      current    = min

      filename = "reporte_totalizado_#{evaluacion.nombre_para_archivo}.csv"
      path_to_file = File.join(Rails.root, 'public', 'reportes', filename)

      File.open(path_to_file, 'w') do |f|
        f.puts row('fecha','mes','año','evaluador', 'cargo evaluador', 'filial evaluador', 'area evaluador', 'evaluado','cargo evaluado', 'filial evaluado','area evaluado', 'evaluado por', 'competencia', 'puntaje')

        while (current <= max) do
          batch = current + 50
          Usuario.find(:all, :order => 'id ASC', :conditions => ['id >= ? AND id <= ?', current, batch]).each do |evaluador|
            evaluador.evaluados.por_evaluacion(evaluacion).each do |evaluado|
              usuario_evaluado = evaluado.usuario_evaluado # evaluado
              tipo_evaluador   = tipo_evaluador(evaluado.tipo, usuario_evaluado.id, evaluador.id)


              total_general    = usuario_evaluado.resultado_tipo_competencia(:generales,evaluacion)
              total_especifica = usuario_evaluado.resultado_tipo_competencia(:especificas,evaluacion)

#              total_general    = usuario_evaluado.porcentaje_competencias_por_evaluador(evaluacion,:general, evaluador, tipo_evaluador)
#              total_especifica = usuario_evaluado.porcentaje_competencias_por_evaluador(evaluacion,:especifica, evaluador, tipo_evaluador)

              if total_especifica != 0
                f.puts row(evaluacion.strf_fecha,
                  evaluacion.fecha.strftime("%B"),
                  evaluacion.fecha.year,
                  evaluador.nombre,
                  evaluador.cargo.try(:nombre),
                  evaluador.sucursal.try(:nombre),
                  evaluador.cargo ? evaluador.cargo.area.nombre : '',
                  usuario_evaluado.nombre,
                  usuario_evaluado.cargo.try(:nombre),
                  usuario_evaluado.sucursal.try(:nombre),
                  usuario_evaluado.cargo ? usuario_evaluado.cargo.area.nombre : '',
                  tipo_evaluador,
                  "especifica",
                  #total_especifica)
                  total_especifica.to_s.gsub('.', ','))
              end
              if total_general != 0
                f.puts row(evaluacion.strf_fecha,
                  evaluacion.fecha.strftime("%B"),
                  evaluacion.fecha.year,
                  evaluador.nombre,
                  evaluador.cargo.try(:nombre),
                  evaluador.sucursal.try(:nombre),
                  evaluador.cargo ? evaluador.cargo.area.nombre : '',
                  usuario_evaluado.nombre,
                  usuario_evaluado.cargo.try(:nombre),
                  usuario_evaluado.sucursal.try(:nombre),
                  usuario_evaluado.cargo ? usuario_evaluado.cargo.area.nombre : '',
                  tipo_evaluador,
                  "general",
                  #total_general)
                  total_general.to_s.gsub('.', ','))
              end
              print "."
              $stdout.flush
            end
          end
          4.times { sleep 0.25 }
          current = batch + 1
        end
      end
    end
  end
end

